#ifndef JIAJIA_JJSYMTAB_HPP
#define JIAJIA_JJSYMTAB_HPP

#include"jiajiastd.hpp"

namespace jiajia{
    // 符号表，加加没有很多区域的区分，一个符号就足够应付，所以写成单例程模式
    class jjsymtab{
    public:
        table_t mGlobal;
        my::avl<string_t> mName;
        my::allocstack mTempAS;
        my::allocstack mGValueAS;               // 用于新增一些全局值的
        value_t * mLoopFactorDefaultValue;
        value_t * mLoopFactorForwardValue;
        value_t * mShi;
        value_t * mFou;

    public:
        jjsymtab():
            mGlobal(),
            mName(),
            mTempAS(),
            mGValueAS(),
            mLoopFactorDefaultValue(nullptr),
            mLoopFactorForwardValue(nullptr),
            mShi(nullptr),
            mFou(nullptr)
            {
                // 设置一些环境中的变量值
                mLoopFactorDefaultValue = newGValue();
                mLoopFactorDefaultValue->setReal(0.0);
                mLoopFactorDefaultValue->immutable();

                mLoopFactorForwardValue = newGValue();
                mLoopFactorForwardValue->setReal(1.0);
                mLoopFactorForwardValue->immutable();

                // 是否语句的值
                mShi = newGValue();
                mShi->setBool(true);

                mFou = newGValue();
                mFou->setBool(false);
            }

        inline table_t * global(){ return &mGlobal; }

        inline string_t * insertID(string_t && name){
            return mName.insert(std::move(name));
        }

        inline string_t * insertID(const string_t & name){
            return mName.insert(name);
        }

        inline string_t * insertID(const jjtoken & token){
            return mName.insert(std::move(token.getSrc()));
        }

        inline string_t * findID(const string_t & name){
            return mName.find(name);
        }

        void clearGlobal(){
            mGlobal.free();
        }

        // 匿名全局值
        value_t * newGValue(){
            return mem::salloc<value_t>(mGValueAS, 1);
        }

        // 一些值
        inline value_t * loopFactorDefault(){
            return mLoopFactorDefaultValue;
        }

        inline value_t * loopFactorForward(){
            return mLoopFactorForwardValue;
        }

        inline value_t * shi(){
            return mShi;
        }

        inline value_t * fou(){
            return mFou;
        }

        // 临时变量的操作
        value_t * newTemp(){
            return mem::salloc<value_t>(mTempAS, 1);
        }

        void clearTemp(){
            mTempAS.free();
        }

    };
}

#endif
